/*
 * Este software codifica frases segun el tipo de codificacion que le pasemos como argumento
 * y segun el codigo que tambien le pasemos como argumento.
 * El primier argumento es el idioma que se utiliza para los mensajes en pantalla
 */
package eac3_2;

//Importamos la biblioteca necesaria para utilizar el escaner de teclado
import java.util.Scanner;


//@Powered by Miguel Gonzalez Jimenez ;)

public class LecturaArguments {
    //Se crean las constantes.    
    public static final int MAX_INTENT = 3;
    public static final int TAMAÑO_MIN = 5;
    
    public static void main(String[] args) {
        //Creamos el objeto escaner
        Scanner teclat = new Scanner(System.in);
        //Creamos las variables
        int idioma = 0;
        int encriptacion = 0;
        int codigo = 0;
        String frase1="";
        String frase2="";
        String[][] missatges =  {{"Codi d'idioma incorrecte. Cal introduir -CAT -CAS o bé -ENG", 
            "Mode de generació incorrecte. Cal introduir -SUS o -AL",  
            "Codi de substitució incorrecte. Cal que sigui 2, 3 o 4", 
            "Dades incorrectes. Si us plau, introdueix una frase amb un mínim de 5 caràcters",
            "Dades incorrectes. Programa finalitzat"},{
                "Código de idioma incorrecto. Ha de ser -CAT -CAS o -ENG", 
                "Modo de generación incorrecto. Ha de ser -SUS o -AL",  
                "Código de sustitución incorrecto. Ha de ser 2, 3 o 4", 
                "Datos incorrectos. Por favor, introduzca una frase de 5 carácteres o más",
                "Datos incorrectos. Se cierra el programa"},{                  
                    "Wrong Language Code. Enter -CAT -CAS or -ENG", 
                    "Wrong Generation Mode. Enter -SUS or -AL",  
                    "Wrong Replacement Code. Enter 2, 3 o 4", 
                    "Wrong data. Please, enter a sentence (at least 5 characters long)",
                    "Wrong data. The program has finished"}};        
                     
        if (args.length == 3) { //Se comprueba el argumento idioma y se asigna ala variable el valor adecuado     
            if("-CAT".equals(args[0]) || "-CAS".equals(args[0]) || "-ENG".equals(args[0])){
                 switch (args[0]) {
                     case "-CAT":
                         idioma = 0;
                         break;
                     case "-CAS":
                         idioma = 1;
                         break;
                     default:
                         idioma = 2;
                         break;
                 }                         
            }
            else { //Si el valor es incorrecto se muestran por pantalla el mensaje de error en tres idiomas
                System.out.println(missatges[0][0]);
                System.out.println(missatges[1][0]);
                System.out.println(missatges[2][0]);
            }
            
            if("-SUS".equals(args[1]) || "-AL".equals(args[1])){ //Se comprueba el argumento tipo de encriptacion y se asigna a la variable
                 switch (args[1]) {
                     case "-SUS":
                         encriptacion = 1;
                         break;
                     default:
                         encriptacion = 2;
                         break;
                 }                         
            }
            else //En caso de que el argumento no sea valido muestra el mensaje en pantalla
                System.out.println(missatges[idioma][1]);
                      
            if("2".equals(args[2]) || "3".equals(args[2]) || "4".equals(args[2])){ //Se comprueba el argumento y se asigna a la variable
                codigo = Integer.parseInt(args[2]); //Convierte el valor del argumento en tipo int para utilizarlo                
            }
            else //En caso de argumento no valido muestra el mensaje en pantalla
                System.out.println(missatges[idioma][2]);
        }
        else {
            // Si el numero de argumentos no es correcto    
            System.out.println("Error en el numero de argumentos.");
        }
        
        System.out.println("introdueix una frase:"); //Solicita la primera frase
        if(encriptacion ==1) { //Encriptacion -SUS        
            int intentos = 0;
            do{
                frase1 = teclat.nextLine(); //Capturamos el texto a codificar
                if(frase1.length() < TAMAÑO_MIN) { //Si el tamaño es inferior al minimo
                    intentos++;      //Incrementa un intento
                    if(intentos !=MAX_INTENT) //Si aun no ha superado el maximo de intentos muestra el mensaje adecuado
                        System.out.println(missatges[idioma][3]);
                    else //Si ha superado el maximo de intentos muestra el mensaje adecuado
                        System.out.println(missatges[idioma][4]);
                }
                else { //Si ha introducido un texto con 5 o mas caracteres
                    intentos =5; //Para salir del bucle
                    switch (codigo){ //Segun el codigo realiza el remplazo pertiente
                        case 2:
                            frase1 = frase1.replace("o","2");
                            System.out.println("La frase encriptada és: " + frase1);
                            break;
                        case 3:
                            frase1 = frase1.replace("e","3");
                            System.out.println("La frase encriptada és: " + frase1);
                            break;
                        case 4:
                            frase1 = frase1.replace("a","4");
                            System.out.println("La frase encriptada és: " + frase1);
                            break;  
                    }                            
                }
            }
            while( intentos <MAX_INTENT); //Lo repetirá hasta el maximo de intentos 
        }
        else if (encriptacion ==2) {//Encriptacion -AL
            int intentos = 0;
            do{
                frase1 = teclat.nextLine(); //Capturamos el texto a codificar
                if(frase1.length() < TAMAÑO_MIN) { //Si el tamaño es menor al minimo
                    intentos++;      //Incrementa el numero de intentos
                    if(intentos !=MAX_INTENT)
                        System.out.println(missatges[idioma][3]);//Si aun no ha superado el maximo de intentos muestra el mensaje adecuado
                    else
                        System.out.println(missatges[idioma][4]);//Si ha superado el maximo de intentos muestra el mensaje adecuado
                }
                else { //Si ha introducido un texto con 5 o mas caracteres
                    intentos = 5; //Actualiza la variable para que despues salga del bucle
                    int intentosBucle2 = 0;
                    System.out.println("introdueix 2ª frase:"); //Solicita la segunda frase
                    do{
                        frase2 = teclat.nextLine(); //Capturamos el 2º texto a codificar
                        if(frase2.length() < frase1.length()) { //Si el tamaño de la segunda frase es inferior al de la primera
                            intentosBucle2++;    //Incrementa los intentos  
                            if(intentosBucle2 !=3)
                                System.out.println(missatges[idioma][3]); //Si aun no ha superado el maximo de intentos muestra el mensaje adecuado
                            else
                                System.out.println(missatges[idioma][4]);//Si  ha superado el maximo de intentos muestra el mensaje adecuado
                        }
                        else { //Si el tamaño de la variable es adecuado
                            intentosBucle2 = 5; //Para salir del bucle                            
                            String fraseCodificada = ""; //Almacenara la frase codificada
                            String fraseAuxiliar =""; //Almacenara la frase auxiliar
                            
                            //Realiza un bucle que añade a la frase codificada el texto de la posicion de la frase 2 cuando es multiplo de el codigo pasado como argumento
                            //y añade el texto de la frase 1 cuando i no es multiplo de 2
                            //Hace al contrario con la frase Auxiliar
                            //Al final añade a la frase auxiliar lo que queda pendiente de la frase2
                            for(int i = 0; i< frase1.length(); i++) {
                                if(i%codigo==0) {
                                    fraseCodificada = fraseCodificada + frase2.charAt(i);
                                    fraseAuxiliar = fraseAuxiliar + frase1.charAt(i);
                                }
                                else{
                                    fraseCodificada = fraseCodificada + frase1.charAt(i);
                                    fraseAuxiliar = fraseAuxiliar + frase2.charAt(i);
                                }                                
                            }
                            if(frase1.length() != frase2.length()) {
                                fraseAuxiliar = fraseAuxiliar + frase2.substring(frase1.length()); //Añade lo que le falta a la frase
                            }
                            //Muestra las frases en pantalla                            
                            System.out.println("La frase encriptada es: "+fraseCodificada); 
                            System.out.println("La frase auxiliar es: "+ fraseAuxiliar);  
                        }
                    }
                    while(intentosBucle2 <MAX_INTENT);  //Lo va ha intentar hasta 3 veces
                }
            }
            while(intentos <MAX_INTENT);  //Lo va ha intentar hasta 3 veces
        }      
    }
}
